perm filename DTLSER.MID[DLN,MRC] blob
sn#529461 filedate 1980-08-10 generic text, type C, neo UTF8
COMMENT ā VALID 00005 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE DTLSER
C00004 00003 CORBEG RPCBLK WINDOW TTYLIN PTIBUF DLIBUF DLOBUF COREND ECHOFF TYSBLK IMPSET LINCON LINCOF GAGOFF NTYSTS TERMID
C00006 00004 DTLSER
C00008 00005 LOOP DLILP0 DLILUP PTILP0 PTILUP DLNSND DLNFRC
C00010 ENDMK
Cā;
TITLE DTLSER
SUBTTL Definitions
; Mark Crispin, SU-AI, August '80
; Dialnet TELNET server
; Assembly switches
IFNDEF DLIBSZ,DLIBSZ==40. ; DLN input buffer size
IFNDEF DLOBSZ,DLOBSZ==256. ; DLN output buffer size
; AC definitions
A=1 ? B=2 ? C=3 ? D=4
; System definitions
INTPTO==001000,, ; PTY interrupt
INTCLK==000200,, ; clock interrupts
INTIMS==000020,, ; DLN status change
INTINP==000010,, ; DLN input
IO%CLS==000200 ; connection closing
IO%EOF==000400 ; end of file
ECHARR==010000,, ; echo controls with uparrow
FCS== 000020,, ; full character set
TBXPND==000010,, ; software tabs
FULTWX==000004,, ; no echo
XON== 000002,, ; paper tape mode
; Macros
DEFINE FATAL TEXT
JRST [ OUTSTR [ASCIZ\!TEXT
\]
EXIT 1,
JRST .-1]
TERMIN
;CORBEG RPCBLK WINDOW TTYLIN PTIBUF DLIBUF DLOBUF COREND ECHOFF TYSBLK IMPSET LINCON LINCOF GAGOFF NTYSTS TERMID
SUBTTL Data area
CORBEG==. ; first loc zeroed at init time
RPCBLK: 0 ; RPC command block
BLOCK 2 ; no PID
WINDOW: BLOCK 1 ; window size
BLOCK 1 ; no phone number
TTYLIN: BLOCK 1 ; remember PTY line number here
PTIBUF: BLOCK 30. ; PTY input buffer
DLIBUF: BLOCK DLIBSZ/4 ; DLN input buffer
DLOBUF: BLOCK DLOBSZ/4 ; DLN output buffer
COREND==.-1
ECHOFF: 001400,,(FULTWX) ; echo off
TYSBLK==. ; TTYSET command block
IMPSET: 034400,, ; IMP TTY
LINCON: 001400,,(ECHARR\FCS\TBXPND) ; default line chars
LINCOF: 002400,,(XON\FULTWX)
GAGOFF: 024400,, ; gag off
NTYSTS==.-TYSBLK
TERMID: 'TERMID ; terminal ID for FINGER
ASCIZ/Dialnet/
;DTLSER
SUBTTL Start of program
DTLSER: CAI
RESET ; flush all I/O
MOVE B,17 ; DLNLGR passes device name in AC 17
GETPPN A,
CAME A,['NETSYS]
MOVE B,[SIXBIT/DLN2/]
MOVEI A,417 ; dump mode
SETZ C, ; no buffers
OPEN A ; seize the port
FATAL Port OPEN failed
SETSTS 17 ; clear no-wait bit
MOVEI A,5 ; system maximum buffer size
MOVEM A,WINDOW
MTAPE RPCBLK ; accept the RPC
FATAL Accept RPC failed
MTAPE [7] ; wait for connection
FATAL Connection wait failed
PTYGET A ; snarf a PTY
FATAL Unable to get any PTY
HRRZM A,TTYLIN
MOVSI (A) ; set up TTYSET command words
IRPS FOO,,ECHOFF IMPSET LINCON LINCOF GAGOFF
IORM FOO
TERMIN
MOVEI TERMID
MOVEM JOBVER
HRROI ECHOFF
TTYSET
MOVEI B,[ASCIZ/Hello
/]
PTWRS7 A
MOVE [-NTYSTS,,TYSBLK] ; set up initial TTY status
TTYSET
LOCK
MOVEI [DISMIS] ; set up interrupt server
MOVEM JOBAPR
CLKINT 2*60.
MOVSI (INTPTO\INTIMS\INTINP\INTCLK)
INTENB ; enable interrupts
; falls through
;LOOP DLILP0 DLILUP PTILP0 PTILUP DLNSND DLNFRC
SUBTTL Main program
; drops in
LOOP: IWAIT ; wait for an interrupt to happen
DLILP0: DMOVE A,[441140,,DLIBUF ? DLIBSZ]
SETZ C,
INPUT A
JUMPN C,[OUTSTR [ASCIZ/User used non-zero channel
/]
JRST 4,.+1]
MOVE A,[441100,,DLIBUF]
SUBI B,DLIBSZ ; B ā - # of characters in buffer
JUMPE B,PTILP0 ; no input characters
MOVE C,TTYLIN
DLILUP: ILDB D,A
PTWR1W C
AOJL B,DLILUP
JRST DLILP0
PTILP0: STATZ IO%EOF ; that it?
EXIT
DMOVE C,[441100,,DLOBUF ? DLOBSZ]
MOVE A,TTYLIN ; read buffer from PTY
MOVE B,[441140,,PTIBUF]
PTRDS A
PTILUP: ILDB B
JUMPE DLNSND ; buffer empty
ANDI 377
IDPB C
SOJG D,PTILUP
DLNSND: DMOVE A,[441100,,DLOBUF ? DLOBSZ]
SUBI B,(D) ; subtract unused characters in buffer
JUMPE B,DLNFRC ; no bytes to do
SETZ C, ; channel 0
OUTPUT A ; send the buffer
JRST PTILP0
DLNFRC: MTAPE [5] ; force buffer out
JRST LOOP
END DTLSER